<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 工厂模式 构造函数 ---》类 ----》生成对象的；
        // 1.注意：表示类的函数 约定俗成 首字母大写； 为了和普通的函数区分一下；
        // 工厂模式

        /* 
            let obj = new Object();
            let str = new String();
            let arr = new Array();
        */

        // let obj = {
        //     name:"张三",
        //     age:20,
        //     showNameAge(){
        //         // console.log("姓名是："+obj.name+"年龄是"+obj.age);
        //         console.log("姓名是："+this.name+"年龄是"+this.age);
        //     }
        // }
        // obj.showNameAge();


        // 工厂模式
        // function Person(name){
        //     let obj = {};
        //     obj.name = name;
        //     obj.fn = function(){
        //         console.log("fn");
        //         console.log(this);
        //     }
        //     return obj;
        // }

        // let zhangsan  = Person("张三");
        // zhangsan.fn();

        // 注意：1.构造函数里的this指向实例化之后的对象
        // 2.会把属性放在构造函数内部 把方法放在构造函数的原型上；
        // 构造函数；
        function Person(name){
            this.name = name;
            // this.fn = function(){
            //     console.log("fn");
            //     // console.log(this);
            //     console.log("名字是"+this.name);
            // }
        }
        Person.prototype.fn = function(){
            console.log("fn");
            console.log("名字是"+this.name);
        }

        let zhangsan  = new Person("张三");  //new就是实例化
        zhangsan.fn();

        let lisi = new Person("李四");
        lisi.fn();
        console.log(zhangsan.fn===lisi.fn);

        // 总结：1.首字母大写  2. this的指向问题  3. 属性和方法放置问题；
    </script>
</body>
</html>